/* SINTACTICO */
grammar AnaXML;

options{
	k = 3;
}

@header{ package pl.equipo13.p6; }

@lexer::header{ package pl.equipo13.p6; }

@rulecath { 
	 catch (RecognitionException ae) {
               System.err.println(ae.getMessage());
           throw ae;
       }
}

@lexer::members{ boolean sw = false; }

entrada: registro EOF;
registro: MENOR BIBLIOTECA contenido* MAYOR (libros COMENTARIO?)+ MENORBARRA BIBLIOTECA MAYOR;
libros: MENOR LIBRO contenido* MAYOR datos MENORBARRA LIBRO MAYOR;
datos: titulo autor editorial;
titulo: MENOR TITULO contenido* MAYOR CADENA MENORBARRA TITULO MAYOR;
autor: MENOR AUTOR contenido* MAYOR CADENA MENORBARRA AUTOR MAYOR;
editorial: MENOR EDITORIAL contenido* MAYOR CADENA MENORBARRA EDITORIAL MAYOR;
contenido: ATRIBUTO IGUAL VALOR;

/* LEXICO */
BIBLIOTECA : {sw}? =>  'biblioteca';
LIBRO : {sw}? =>  'libro';
TITULO :{sw}? =>  'titulo';
AUTOR : {sw}? => 'autor';
EDITORIAL : {sw}? => 'editorial';

/* Reglas */
fragment NUEVA_LINEA: ('\n' | '\r\n');
fragment DIGITO: '0'..'9';
fragment LETRA: ('A'..'Z') | ('a'..'z') | '.';
fragment NUMERO: (DIGITO)+('.'(DIGITO)+)?;
BLANCO: (' '|'\t'|NUEVA_LINEA) {$channel=HIDDEN;};
COMENTARIO: '<!--' (options {greedy=false;}:.)* '-->' {$channel=HIDDEN;};
MENOR: '<' {sw = true;};
MAYOR: {sw}? => '>' {sw = false;};
MENORBARRA: '</' {sw = true;};
ATRIBUTO: {sw}? => LETRA+;
IGUAL: {sw}? => '=';
VALOR: {sw}? => '"' LETRA+ '"';
CADENA: {!sw}? => (LETRA | NUMERO | ' ')+;